﻿

/// <remarks>Original code found here: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx</remarks>
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
 
[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue>
        : Dictionary<TKey, TValue>, IXmlSerializable
{
        #region IXmlSerializable Members
	public System.Xml.Schema.XmlSchema GetSchema ()
	{
		return null;
	}
 
	public void ReadXml (System.Xml.XmlReader reader)
	{
		XmlSerializer keySerializer = new XmlSerializer (typeof(TKey));
		XmlSerializer valueSerializer = new XmlSerializer (typeof(TValue));
 
		bool wasEmpty = reader.IsEmptyElement;
		reader.Read ();
 
		if (wasEmpty)
			return;
 
		while (reader.NodeType != System.Xml.XmlNodeType.EndElement) {
			reader.ReadStartElement ("item");
 
			reader.ReadStartElement ("key");
			TKey key = (TKey)keySerializer.Deserialize (reader);
			reader.ReadEndElement ();
 
			reader.ReadStartElement ("value");
			TValue value = (TValue)valueSerializer.Deserialize (reader);
			reader.ReadEndElement ();
 
			this.Add (key, value);
 
			reader.ReadEndElement ();
			reader.MoveToContent ();
		}
		reader.ReadEndElement ();
	}
 
	public void WriteXml (System.Xml.XmlWriter writer)
	{
		XmlSerializer keySerializer = new XmlSerializer (typeof(TKey));
		XmlSerializer valueSerializer = new XmlSerializer (typeof(TValue));
 
		foreach (TKey key in this.Keys) {
			writer.WriteStartElement ("item");
 
			writer.WriteStartElement ("key");
			keySerializer.Serialize (writer, key);
			writer.WriteEndElement ();
 
			writer.WriteStartElement ("value");
			TValue value = this [key];
			valueSerializer.Serialize (writer, value);
			writer.WriteEndElement ();
 
			writer.WriteEndElement ();
		}
	}
        #endregion
    }